package dao;

import bean.QueryParam;
import bean.Student;
import bean.Student02;
import bean.ViewStudent;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface StudentDao {

    /**
     * 查询所有学生
     *
     * @return 返回一个list集合，集合中存储所有学生的信息
     * 在接口中方法前面的public abstract可以不写，默认有
     */
    public abstract List<Student> queryStudents();

    /**
     * 通过id查询学生
     * 一个简单类型的参数（基本数据类型和String类型）
     * 一个简单类型的参数：
     * 简单类型： mybatis把java的基本数据类型和String都叫简单类型。
     * 在mapper文件获取简单类型的一个参数的值，使用 #{任意字符}
     *
     * @param id
     * @return 返回一个学生对象
     */
    Student queryStudentById(Integer id);

    /**
     * 插入一条学生数据
     * 多个参数，使用java对象作为接口中方法的参数
     *
     * @param student
     * @return 返回值int类型，表示影响数据库的行数，这里表示插入数据的行数
     */
    int insertStudent(Student student);

    /**
     * 修改学生信息，使用自动提交事务
     * 多个参数，使用java对象作为接口中方法的参数
     *
     * @param student
     * @return
     */
    int updateStudent(Student student);

    /**
     * 多个参数： 命名参数，在形参定义的前面加入 @Param("自定义参数名称")
     *
     * @param name
     * @param age
     * @return
     */
    List<Student> selectMultiParam(@Param("name") String name, @Param("age") Integer age);

    /**
     * 多个参数，使用java对象作为接口中方法的参数
     */
    List<Student> selectMultiObject(QueryParam param);

    /**
     * 多个参数-简单类型的，按位置传值，
     * mybatis.3.4之前，使用 #{0} ，#{1}
     * mybatis。3.4之后 ，使用 #{arg0} ,#{arg1}
     */
    List<Student> selectMultiPosition(String name, Integer age);

    /**
     * 多个参数，使用Map存放多个值
     */
    List<Student> selectMultiByMap(Map<String, Object> map);

    /**
     * 通过姓名查询学生信息，使用$符号
     *
     * @param name
     * @return 返回学生信息
     */
    Student selectStudentByNameUse$(@Param("name") String name);

    /**
     * 替换列名
     *
     * @param colName
     * @return
     */
    List<Student> selectStudentByNameUse$Order(@Param("colName") String colName);


    /**
     * 通过姓名或者年龄查询学生信息，使用$排序和#填充占位符，
     *
     * @param name
     * @param age
     * @return
     */
    List<Student> selectStudentByNameOrAgeUse$OrderBy(@Param("name") String name, @Param("age") Integer age, @Param("colName") String colName);


    /**
     * 通过id查询学生信息返回值数据类型变为ViewStudent
     *
     * @param id
     * @return
     */
    ViewStudent selectStudentReturnViewStudent(@Param("id") Integer id);

    /**
     * 统计学生的个数
     *
     * @return 返回值是所有学生的个数，返回值类型和StudentDao.xml中ResultType保持一致
     */
    int countStudent();

    /**
     * 定义方法返回map
     *
     * @return 返回一个map集合
     */
    Map<Object, Object> selectMapById(@Param("id") Integer id);

    /**
     * 使用ResultMap定义映射关系
     */
    List<Student> selectAllStudents();

    /**
     * 使用ResultMap定义映射关系
     */
    List<Student02> selectAllStudents02();

    /**
     * 使用ResultMap定义映射关系
     */
    List<Student02> selectAllStudents03();

    /**
     * 第一种模糊查询的方式：在java代码中指定like的内容
     */
    List<Student> selectLikeOne(String name);

    /**
     * 第二种模糊查询的方式：在mapper文件中使用拼接的方式 "%" 李 "%"
     */
    List<Student> selectLikeTwo(String name);
}
